// 顺序存储二叉树 特点
// 1.只考虑完全二叉树
// 2.第n个元素的左子节点为 2*n+1
// 3.第n个元素的右子节点为 2*n+2
// 3.第n个元素的父节点为  (n-1)/2

class ArrayBinaryTree {
    arr = []

    constructor (arr) {
        this.arr = arr
    }

    /**
     * 顺序储存二叉树前序遍历
     * @param index{number} 数组下标
     */
    preOrder (index = 0) {
        if (this.arr === null || this.arr?.length === 0) {
            console.log('数组为空不能遍历')
        }
        // 输出当前元素
        console.log(this.arr[index])
        // 向左递归
        if ((index * 2 + 1) < this.arr.length) {
            this.preOrder(2 * index + 1)
        }
        // 向右递归
        if ((index * 2 + 2) < this.arr.length) {
            this.preOrder(2 * index + 2)
        }
    }

    /**
     * 顺序储存二叉树中序遍历
     * @param index{number} 数组下标
     */
    infixOrder (index = 0) {
        if (this.arr === null || this.arr?.length === 0) {
            console.log('数组为空不能遍历')
        }
        // 向左递归
        if ((index * 2 + 1) < this.arr.length) {
            this.preOrder(2 * index + 1)
        }
        // 输出当前元素
        console.log(this.arr[index])
        // 向右递归
        if ((index * 2 + 2) < this.arr.length) {
            this.preOrder(2 * index + 2)
        }
    }

    /**
     * 顺序储存二叉树后序遍历
     * @param index{number} 数组下标
     */
    postOrder (index = 0) {
        if (this.arr === null || this.arr?.length === 0) {
            console.log('数组为空不能遍历')
        }
        // 向左递归
        if ((index * 2 + 1) < this.arr.length) {
            this.preOrder(2 * index + 1)
        }
        // 向右递归
        if ((index * 2 + 2) < this.arr.length) {
            this.preOrder(2 * index + 2)
        }
        // 输出当前元素
        console.log(this.arr[index])
    }
}

function main () {
    let arr = [1, 2, 3, 4, 5, 6, 7]
    let arrBinaryTree = new ArrayBinaryTree(arr)
    console.log('前序遍历') // 1245367
    arrBinaryTree.preOrder()
    console.log('中序遍历') // 2451367
    arrBinaryTree.infixOrder()
    console.log('后序遍历') // 2453671
    arrBinaryTree.postOrder()
}

main()
